/**
 * \file   emitir.h
 * \author Fabian Jesus Machado
 * \date   Septiembre de 2011
 * 
 *  Este archivo es parte del proyecto NPASM, un ensamblador para
 * microcontroladores PIC con sintaxis Intel, desarrollado inicialmente
 * por Fabian Machado (fabianjsm@gmail.com, twitter@fabianjsm).
 *  El codigo fuente esta diponible en el repositorio SVN de Google:
 *      http://npasm.googlecode.com/svn/trunk.
 * 
 * Septiembre de 2011.
 * 
 */
#ifndef	EMITIR_H
#define	EMITIR_H
#include "ts.h"

#define NO_ARG           0x00      /* No es un argumento */
#define	ARG_W            0x01      /* Registro W */
#define	ARG_F            0x02      /* F resuelto */
#define	ARG_EXTERN_F     0x03      /* F sin resolver */
#define	ARG_NUM          0x04      /* Literal, un numero */
#define	ARG_BIT          0x05      /* Bit resuelto */
#define	ARG_EXTERN_BIT   0x06      /* Bit totalmente sin resolver */
#define	ARG_BIT_EXTERN_F 0x07      /* Bit con f sin resolver */

struct struct_arg {
	int tipo;                      /* Tipo de argumento */
	union {                        /* Valor */
		simbolo *sbl;
		unsigned long num;
	} val;
	void operator=(unsigned long); /* Operador = (unsigned long) */
	void operator=(simbolo *);     /* Operador = (simbolo *) */
	operator unsigned long();      /* Operador cast (unsigned long) */
	operator simbolo *();          /* Operador cast (simbolo *) */
};

struct linea_asm {
	simbolo *i;                    /* Instruccion */
	int t;                         /* Tipo de instruccion */
	struct_arg arg0;               /* Primer argumento */
	struct_arg arg1;               /* Segundo argumento */
};

void aceptar_etiqueta(simbolo *, int);
void emitir_instr(linea_asm *l);
void emitir_log(const char *s, ...);
void emitir_mkretlw(unsigned long, unsigned long);
unsigned long emitir_division(unsigned long, unsigned long);

#endif	/* EMITIR_H */
